package com.johnlam.soundcloud;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.JsonReader;
import android.util.JsonToken;
import com.johnlam.soundcloud.object.CommentObject;
import com.johnlam.soundcloud.object.TrackObject;
import com.ypyproductions.utils.DBLog;
import com.ypyproductions.utils.DateTimeUtils;
import com.ypyproductions.utils.StringUtils;
/**
*
*
* @author:YPY Productions
* @Skype: baopfiev_k50
* @Mobile : +84 983 028 786
* @Email: dotrungbao@gmail.com
* @Website: www.ypyproductions.com
* @Project:AndroidCloundMusicPlayer
* @Date:Dec 14, 2014
*
*/
public class SoundCloudJsonParsingUtils {
public static final String TAG = SoundCloudJsonParsingUtils.class.getSimpleName();
public static final String DATE_PATTERN_ORI = "yyyy/MM/dd hh:mm:ss Z";
private static TrackObject parsingTrackObject(JSONObject mJsonObject){
if(mJsonObject!=null){
try {
long id = mJsonObject.getLong("id");
String createdAt = mJsonObject.getString("created_at");
Date mDate = DateTimeUtils.getDateFromString(createdAt, DATE_PATTERN_ORI);
long userId = mJsonObject.getLong("user_id");
long duration = mJsonObject.getLong("duration");
String sharing = mJsonObject.getString("sharing");
String tagList = mJsonObject.getString("tag_list");
String genre = mJsonObject.getString("genre");
String title = mJsonObject.getString("title");
String description= mJsonObject.getString("description");
JSONObject mJsUser = mJsonObject.getJSONObject("user");
String username = mJsUser.getString("username");
String avartar = mJsUser.getString("avatar_url");
String permalinkUrl= mJsonObject.getString("permalink_url");
String artworkUrl = mJsonObject.getString("artwork_url");
String waveformUrl = mJsonObject.getString("waveform_url");
long playCount = mJsonObject.getLong("playback_count");
long favoritingsCount = mJsonObject.getLong("favoritings_count");
long commentCount = mJsonObject.getLong("comment_count");
boolean streamable = mJsonObject.getBoolean("streamable");
TrackObject mTrackObject = new TrackObject(id, mDate, userId, duration, sharing,
tagList, genre, title, description, username, avartar, permalinkUrl, artworkUrl, waveformUrl,
playCount, favoritingsCount, commentCount);
mTrackObject.setStreamable(streamable);
return mTrackObject;
}
catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}
private static TrackObject parsingNewTrackObject(JsonReader reader){
if(reader!=null){
try {
TrackObject mTrackObject=null;
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("id")) {
mTrackObject = new TrackObject();
mTrackObject.setId(reader.nextLong());
}
else if(name.equals("created_at")){
if(mTrackObject!=null){
String createdAt = reader.nextString();
Date mDate = DateTimeUtils.getDateFromString(createdAt, DATE_PATTERN_ORI);
mTrackObject.setCreatedDate(mDate);
}
}
else if(name.equals("user_id")){
if(mTrackObject!=null){
mTrackObject.setUserId(reader.nextLong());
}
}
else if(name.equals("duration")){
if(mTrackObject!=null){
mTrackObject.setDuration(reader.nextLong());
}
}
else if(name.equals("sharing")){
if(mTrackObject!=null){
mTrackObject.setSharing(reader.nextString());
}
}
else if(name.equals("tag_list") && reader.peek() != JsonToken.NULL){
if(mTrackObject!=null){
mTrackObject.setTagList(reader.nextString());
}
}
else if (name.equals("streamable") && reader.peek() != JsonToken.NULL) {
if (mTrackObject != null) {
mTrackObject.setStreamable(reader.nextBoolean());
}
}
else if (name.equals("downloadable") && reader.peek() != JsonToken.NULL) {
if (mTrackObject != null) {
mTrackObject.setDownloadable(reader.nextBoolean());
}
}
else if(name.equals("genre") && reader.peek() != JsonToken.NULL){
if(mTrackObject!=null){
mTrackObject.setGenre(reader.nextString());
}
}
else if(name.equals("title") && reader.peek() != JsonToken.NULL){
if(mTrackObject!=null){
mTrackObject.setTitle(reader.nextString());
}
}
else if(name.equals("description") && reader.peek() != JsonToken.NULL){
if(mTrackObject!=null){
mTrackObject.setDescription(reader.nextString());
}
}
else if(name.equals("user")){
reader.beginObject();
while (reader.hasNext()) {
String nameTagUser = reader.nextName();
if(nameTagUser.equals("username")){
if(mTrackObject!=null){
mTrackObject.setUsername(reader.nextString());
}
}
else if(nameTagUser.equals("avatar_url") && reader.peek() != JsonToken.NULL){
if(mTrackObject!=null){
mTrackObject.setAvatarUrl(reader.nextString());
}
}
else{
reader.skipValue();
}
}
reader.endObject();
}
else if(name.equals("permalink_url")){
if(mTrackObject!=null){
mTrackObject.setPermalinkUrl(reader.nextString());
}
}
else if(name.equals("artwork_url") && reader.peek() != JsonToken.NULL){
if(mTrackObject!=null){
mTrackObject.setArtworkUrl(reader.nextString());
}
}
else if(name.equals("waveform_url") ){
if(mTrackObject!=null){
mTrackObject.setWaveForm(reader.nextString());
}
}
else if(name.equals("playback_count")){
if(mTrackObject!=null){
mTrackObject.setPlaybackCount(reader.nextLong());
}
}
else if(name.equals("favoritings_count")){
if(mTrackObject!=null){
mTrackObject.setFavoriteCount(reader.nextLong());
}
}
else if(name.equals("comment_count")){
if(mTrackObject!=null){
mTrackObject.setCommentCount(reader.nextLong());
}
}
else{
reader.skipValue();
}
}
return mTrackObject;
}
catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static ArrayList<TrackObject> parsingListTrackObject(InputStream in) {
if (in == null) {
new Exception(TAG + " data can not null").printStackTrace();
return null;
}
else {
try {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
ArrayList<TrackObject> listTrackObjects = new ArrayList<TrackObject>();
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
TrackObject mTrackObject= parsingNewTrackObject(reader);
if (mTrackObject != null && mTrackObject.isStreamable()) {
listTrackObjects.add(mTrackObject);
}
reader.endObject();
}
reader.endArray();
reader.close();
DBLog.d(TAG, "================>listTrackObjects size="+listTrackObjects.size());
return listTrackObjects;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (in != null) {
try {
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
return null;
}
public static ArrayList<TrackObject> parsingListTrackObject(String data) {
if (!StringUtils.isEmptyString(data)) {
try {
JSONArray mJsonArray = new JSONArray(data);
int size = mJsonArray.length();
if(size>0){
ArrayList<TrackObject> listTrackObjects = new ArrayList<TrackObject>();
for(int i=0;i<size;i++){
TrackObject mTrackObject = parsingTrackObject(mJsonArray.getJSONObject(i));
if(mTrackObject!=null){
listTrackObjects.add(mTrackObject);
}
}
DBLog.d(TAG, "================>listTrackObjects size=" + listTrackObjects.size());
return listTrackObjects;
}
}
catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
private static CommentObject parsingCommentObject(JsonReader reader){
if(reader!=null){
try {
CommentObject mCommentObject=null;
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("id")) {
mCommentObject = new CommentObject();
mCommentObject.setId(reader.nextLong());
}
else if(name.equals("created_at")){
if(mCommentObject!=null){
mCommentObject.setCreatedAt(reader.nextString());
}
}
else if(name.equals("user_id")){
if(mCommentObject!=null){
mCommentObject.setUserId(reader.nextLong());
}
}
else if(name.equals("track_id")){
if(mCommentObject!=null){
mCommentObject.setTrackid(reader.nextLong());
}
}
else if(name.equals("timestamp") && reader.peek() != JsonToken.NULL){
if(mCommentObject!=null){
mCommentObject.setTimeStamp(reader.nextInt());
}
}
else if(name.equals("body")){
if(mCommentObject!=null){
mCommentObject.setBody(reader.nextString());
}
}
else if(name.equals("user")){
reader.beginObject();
while (reader.hasNext()) {
String nameTagUser = reader.nextName();
if(nameTagUser.equals("username")){
if(mCommentObject!=null){
mCommentObject.setUsername(reader.nextString());
}
}
else if(nameTagUser.equals("avatar_url") && reader.peek() != JsonToken.NULL){
if(mCommentObject!=null){
mCommentObject.setAvatarUrl(reader.nextString());
}
}
else{
reader.skipValue();
}
}
reader.endObject();
}
else{
reader.skipValue();
}
}
return mCommentObject;
}
catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static TrackObject parsingTrackObject(String data){
if(!StringUtils.isEmptyString(data)){
JSONObject mJsonObject;
try {
mJsonObject = new JSONObject(data);
return parsingTrackObject(mJsonObject);
}
catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}
public static ArrayList<CommentObject> parsingListCommentObject(InputStream in) {
if (in == null) {
new Exception(TAG + " data can not null").printStackTrace();
return null;
}
else {
try {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
ArrayList<CommentObject> listCommentObjects = new ArrayList<CommentObject>();
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
CommentObject mComment= parsingCommentObject(reader);
if(mComment!=null){
listCommentObjects.add(mComment);
}
reader.endObject();
}
reader.endArray();
reader.close();
DBLog.d(TAG, "================>listCommentObjects size="+listCommentObjects.size());
return listCommentObjects;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (in != null) {
try {
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
return null;
}
}